﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using SistemaBastanteo.Negocio;
using SistemaBastanteo.Dominio;
using Spring.Context.Support;
using SistemaBastanteo.Persistencia;

namespace SistemaBastanteo.Pruebas
{
    
    [TestFixture]
    public class Test10_BastanteoService
    {
        IApplicationContext Spring = null;
        IBastanteoService Service = null;
        Cliente clienteRegistrado = null;
        Representante representanteRegistradoA = null;
        Representante representanteRegistradoB = null;
        Representante representanteRegistradoC = null;
        Representante representanteRegistradoD = null;

        Poder poderCreado = null;
        Poder poderCreado2 = null;

        TipoEmpresa tipoCreado = null;
        TipoDocumento tipoDocCreado = null;

        Bastanteo bastanteoASF = null;
        Bastanteo bastanteoASF2 = null;
        Bastanteo bastanteoASF3 = null;

        Bastanteo bastanteoECJ = null;
        Bastanteo bastanteoECJ2 = null;

        string tipoIntervencionA = "A Sola Firma";
        string tipoIntervencionE = "En Conjunto Con";


        [TestFixtureSetUp]
        public void IniciarPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaBastanteo/SistemaBastanteo/capaPersistencia.xml",
                "assembly://SistemaBastanteo/SistemaBastanteo/capaNegocio.xml"
                );
            Service = (IBastanteoService)Spring.GetObject("bastanteoService");
            tipoCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpresaDAO_NH")).Crear(
                new TipoEmpresa() { Abreviacion = "SAA" });
            
            tipoDocCreado = ((ITipoDocumentoDAO)Spring.GetObject("tipoDocumentoDAO_NH")).Crear(
                new TipoDocumento() { Descripcion = "DNI" });
            
            clienteRegistrado = ((IClienteDAO) Spring.GetObject("clienteDAO_NH")).Crear(
                new Cliente(){ Ruc="12345678901", RazonSocial="UPC", Empleados=10, Inicio=DateTime.Now, Tipo=tipoCreado });
            
            representanteRegistradoA = ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Crear(
                new Representante() { TipoDocumento = tipoDocCreado, Documento = "41404714", Nombres = "Jenny", Apellidos = "Roman Perez", Cargo = "Administradora", Grupo = "A", Cliente = clienteRegistrado});

            representanteRegistradoB = ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Crear(
                new Representante() { TipoDocumento = tipoDocCreado, Documento = "07080771", Nombres = "Juana", Apellidos = "Bravo Lara", Cargo = "Supervisora", Grupo = "B", Cliente = clienteRegistrado });

            representanteRegistradoC = ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Crear(
                new Representante() { TipoDocumento = tipoDocCreado, Documento = "42124280", Nombres = "Juan", Apellidos = "Perez Rojas", Cargo = "Gerente", Grupo = "C", Cliente = clienteRegistrado });
            
            representanteRegistradoD = ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Crear(
                new Representante() { TipoDocumento = tipoDocCreado, Documento = "40414247", Nombres = "George", Apellidos = "Perez Rojas", Cargo = "Contador", Grupo = "D", Cliente = clienteRegistrado });

            poderCreado = ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Crear(
                new Poder() { CodigoCorto = "CHCO", Descripcion="Cobro de cheque", TipoProducto = "Activo" });

            poderCreado2 = ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Crear(
                new Poder() { CodigoCorto = "EFRET", Descripcion = "Retiro de efectivo", TipoProducto = "Activo" });

        }

         [Test]
        public void Test01_RegistrarBastanteo_DatosInsuficientes()
        {
            ICollection<Combinacion> Lista = null;
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarBastanteo(clienteRegistrado.Codigo ,representanteRegistradoA.Grupo,poderCreado.Codigo, tipoIntervencionA,0, DateTime.Now, Lista);
            });
        }

         [Test]
         public void Test02_RegistrarBastanteo_ASolaFirma_Ok()
         {
             ICollection<Combinacion> Lista = null;
             
             Assert.DoesNotThrow(delegate
             {
                 bastanteoASF = Service.RegistrarBastanteo(clienteRegistrado.Codigo, representanteRegistradoA.Grupo, poderCreado.Codigo, tipoIntervencionA, 1500, DateTime.Now, Lista);
             });
             Assert.IsNotNull(bastanteoASF);
             Assert.AreEqual(bastanteoASF.Cliente.Codigo, clienteRegistrado.Codigo );

             Assert.DoesNotThrow(delegate
             {
                 bastanteoASF2 = Service.RegistrarBastanteo(clienteRegistrado.Codigo, representanteRegistradoC.Grupo, poderCreado.Codigo, tipoIntervencionA, 2500, new DateTime(2011, 11, 28), Lista);
             });
             Assert.IsNotNull(bastanteoASF2);
             Assert.AreEqual(bastanteoASF2.Cliente.Codigo, clienteRegistrado.Codigo);

             Assert.DoesNotThrow(delegate
             {
                 bastanteoASF3 = Service.RegistrarBastanteo(clienteRegistrado.Codigo, representanteRegistradoB.Grupo, poderCreado2.Codigo, tipoIntervencionA, 7000, new DateTime(2011, 12, 31), Lista);
             });
             Assert.IsNotNull(bastanteoASF3);
             Assert.AreEqual(bastanteoASF3.Cliente.Codigo, clienteRegistrado.Codigo);
         }

         [Test]
         public void Test03_RegistrarBastanteo_ASolaFirma_Repetido()
         {
             ICollection<Combinacion> Lista = null;
             Assert.Catch<EntidadRepetidaException>(delegate
             {
                 bastanteoASF = Service.RegistrarBastanteo(clienteRegistrado.Codigo, representanteRegistradoA.Grupo, poderCreado.Codigo, tipoIntervencionA, 10, DateTime.Now, Lista);
             });
         }

         [Test]
         public void Test04_RegistrarBastanteo_EnConjuntoCon_DatosInsuficientes()
         {
             ICollection<Combinacion> Lista = null;
             Assert.Catch<DatosInsuficientesException>(delegate
             {
                 Service.RegistrarBastanteo(clienteRegistrado.Codigo, representanteRegistradoB.Grupo, poderCreado.Codigo, tipoIntervencionE, 0, DateTime.Now, Lista);
             });
         }

         [Test]
         public void Test05_RegistrarBastanteo_EnConjuntoCon_CombinacionDuplicadaConPrincipal()
         {
            ICollection<Combinacion> Lista = new List<Combinacion>();
             Bastanteo bastanteoACrear= new Bastanteo();
             bastanteoACrear.Cliente = clienteRegistrado;
             bastanteoACrear.Poder = poderCreado;
             bastanteoACrear.Grupo = representanteRegistradoB.Grupo ;
             bastanteoACrear.Importe = 5000;
             bastanteoACrear.TipoIntervencion = tipoIntervencionE;
             bastanteoACrear.FechaLimite = new DateTime(2011, 12, 30);
             Lista.Add(new Combinacion() { Cliente = bastanteoACrear.Cliente, Grupo = bastanteoACrear, Poder = bastanteoACrear.Poder, GrupoConjunto = "B" });
             Assert.Catch<EntidadRepetidaException>(delegate
             {
                 Service.RegistrarBastanteo
                    (bastanteoACrear.Cliente.Codigo, 
                    bastanteoACrear.Grupo, 
                    bastanteoACrear.Poder.Codigo, 
                    bastanteoACrear.TipoIntervencion, 
                    bastanteoACrear.Importe, 
                    bastanteoACrear.FechaLimite, 
                    Lista);
             });


         }
         [Test]
         public void Test06_RegistrarBastanteo_EnConjuntoCon_CombinacionDuplicadaEnDetalle()
         {
             ICollection<Combinacion> Lista = new List<Combinacion>();
             Bastanteo bastanteoACrear = new Bastanteo();
             bastanteoACrear.Cliente = clienteRegistrado;
             bastanteoACrear.Poder = poderCreado;
             bastanteoACrear.Grupo = representanteRegistradoB.Grupo;
             bastanteoACrear.Importe = 5000;
             bastanteoACrear.TipoIntervencion = tipoIntervencionE;
             bastanteoACrear.FechaLimite = new DateTime(2011, 12, 30);
             Lista.Add(new Combinacion() { Cliente = bastanteoACrear.Cliente, Grupo = bastanteoACrear, Poder = bastanteoACrear.Poder, GrupoConjunto = "A" });
             Lista.Add(new Combinacion() { Cliente = bastanteoACrear.Cliente, Grupo = bastanteoACrear, Poder = bastanteoACrear.Poder, GrupoConjunto = "A" });
             
             Assert.Catch<EntidadRepetidaException>(delegate
             {
                 Service.RegistrarBastanteo
                    (bastanteoACrear.Cliente.Codigo,
                    bastanteoACrear.Grupo,
                    bastanteoACrear.Poder.Codigo,
                    bastanteoACrear.TipoIntervencion,
                    bastanteoACrear.Importe,
                    bastanteoACrear.FechaLimite,
                    Lista);
             });
         }

         [Test]
         public void Test07_RegistrarBastanteo_EnConjunto_OK()
         {
             ICollection<Combinacion> Lista = new List<Combinacion>();
             Bastanteo bastanteoACrear = new Bastanteo();
             bastanteoACrear.Cliente = clienteRegistrado;
             bastanteoACrear.Poder = poderCreado;
             bastanteoACrear.Grupo = representanteRegistradoB.Grupo;
             bastanteoACrear.Importe = 5000;
             bastanteoACrear.TipoIntervencion = tipoIntervencionE;
             bastanteoACrear.FechaLimite = new DateTime(2011, 12, 30);
             Lista.Add(new Combinacion() { 
                 Cliente = bastanteoACrear.Cliente, 
                 Grupo = bastanteoACrear, 
                 Poder = bastanteoACrear.Poder, 
                 GrupoConjunto = "A" });

             Assert.DoesNotThrow(delegate
             {
                 bastanteoECJ = Service.RegistrarBastanteo
                     (bastanteoACrear.Cliente.Codigo,
                     bastanteoACrear.Grupo,
                     bastanteoACrear.Poder.Codigo,
                     bastanteoACrear.TipoIntervencion,
                     bastanteoACrear.Importe,
                     bastanteoACrear.FechaLimite,
                     Lista);
             });

             //
             Lista = new List<Combinacion>();
             bastanteoACrear = new Bastanteo();
             bastanteoACrear.Cliente = clienteRegistrado;
             bastanteoACrear.Poder = poderCreado2;
             bastanteoACrear.Grupo = representanteRegistradoC.Grupo;
             bastanteoACrear.Importe = 5000;
             bastanteoACrear.TipoIntervencion = tipoIntervencionE;
             bastanteoACrear.FechaLimite = new DateTime(2011, 12, 30);
             Lista.Add(new Combinacion()
             {
                 Cliente = bastanteoACrear.Cliente,
                 Grupo = bastanteoACrear,
                 Poder = bastanteoACrear.Poder,
                 GrupoConjunto = "B"
             });

             Assert.DoesNotThrow(delegate
             {
                 bastanteoECJ2 = Service.RegistrarBastanteo
               (bastanteoACrear.Cliente.Codigo,
               bastanteoACrear.Grupo,
               bastanteoACrear.Poder.Codigo,
               bastanteoACrear.TipoIntervencion,
               bastanteoACrear.Importe,
               bastanteoACrear.FechaLimite,
               Lista);
                 
             });


         }

         [Test]
         public void Test08_VerificarPoder_NoTiene()
         {
             string ruc = clienteRegistrado.Ruc ;
             int representante = representanteRegistradoA.Codigo ;
             int poder = poderCreado2.Codigo ; 
             decimal importe = 1500;

             Assert.Catch<OperacionInvalidaException>(delegate
             {
                 Service.VerificarPoder(ruc, representante, poder, importe);
             });

         }

         [Test]
         public void Test09_VerificarPoder_PoderVencido()
         {
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoC.Codigo;
             int poder = poderCreado.Codigo;
             decimal importe = 2500;

             Assert.Catch<OperacionInvalidaException>(delegate
             {
                 Service.VerificarPoder(ruc, representante, poder, importe);
             });

         }

         [Test]
         public void Test10_VerificarPoder_ImporteSuperior()
         {
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoC.Codigo;
             int poder = poderCreado2.Codigo;
             decimal importe = 7000;

             Assert.Catch<OperacionInvalidaException>(delegate
             {
                 Service.VerificarPoder(ruc, representante, poder, importe);
             });

         }

         [Test]
         public void Test11_VerificarPoder_OK()
         {
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoC.Codigo;
             int poder = poderCreado2.Codigo;
             decimal importe = 4500;
             Bastanteo bastanteoVerificado = null;
             Assert.DoesNotThrow(delegate
             {
                 bastanteoVerificado = Service.VerificarPoder(ruc, representante, poder, importe);
             });

             Assert.AreEqual(bastanteoVerificado.Cliente.Ruc, ruc);
             Assert.AreEqual(bastanteoVerificado.Grupo, representanteRegistradoC.Grupo);
             Assert.AreEqual(bastanteoVerificado.Poder.Codigo, poder);
             Assert.GreaterOrEqual(bastanteoVerificado.Importe, importe);

         }

         [Test]
         public void Test12_ConsultarPoderesGrupo_NoTiene()
         {
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoD.Codigo;
             string grupo = representanteRegistradoD.Grupo;
             
             Assert.Catch<OperacionInvalidaException>(delegate
             {
                 Service.ConsultarPoderesPorGrupo(ruc, representante, grupo);
             });

         }

         [Test]
         public void Test13_ConsultarPoderesGrupo_SiTiene()
         {
             ICollection<Bastanteo> Lista = null;
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoC.Codigo;
             string grupo = representanteRegistradoC.Grupo;

             Assert.DoesNotThrow(delegate
             {
                 Lista = Service.ConsultarPoderesPorGrupo(ruc, representante, grupo);
             });

             Assert.IsNotNull (Lista );
             Assert.AreEqual(Lista.Count, 2); 

         }

         [Test]
         public void Test12_ConsultarPoderesTipo_NoTiene()
         {
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoA.Codigo;
             string tipoIntervencion = tipoIntervencionE;

             Assert.Catch<OperacionInvalidaException>(delegate
             {
                 Service.ConsultarPoderesPorTipo(ruc, representante, tipoIntervencion);
             });

         }

         [Test]
         public void Test13_ConsultarPoderesTipo_SiTiene()
         {
             ICollection<Bastanteo> Lista = null;
             string ruc = clienteRegistrado.Ruc;
             int representante = representanteRegistradoB.Codigo;
             string tipoIntervencion = tipoIntervencionA;

             Assert.DoesNotThrow(delegate
             {
                 Lista = Service.ConsultarPoderesPorTipo(ruc, representante, tipoIntervencion);
             });

             Assert.IsNotNull(Lista);
             Assert.AreEqual(Lista.Count, 1);

         }
        
         [TestFixtureTearDown]
         public void FinalizarPruebas()
         {
             ((IBastanteoDAO)Spring.GetObject("BastanteoDAO_ADO")).Eliminar(bastanteoECJ);
             ((IBastanteoDAO)Spring.GetObject("BastanteoDAO_ADO")).Eliminar(bastanteoECJ2);
             ((IBastanteoDAO)Spring.GetObject("BastanteoDAO_ADO")).Eliminar(bastanteoASF);
             ((IBastanteoDAO)Spring.GetObject("BastanteoDAO_ADO")).Eliminar(bastanteoASF2);
             ((IBastanteoDAO)Spring.GetObject("BastanteoDAO_ADO")).Eliminar(bastanteoASF3);
             ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poderCreado);
             ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poderCreado2);
             ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistradoA);
             ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistradoB);
             ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistradoC);
             ((IRepresentanteDAO)Spring.GetObject("representanteDAO_NH")).Eliminar(representanteRegistradoD);
             ((ITipoDocumentoDAO)Spring.GetObject("tipoDocumentoDAO_NH")).Eliminar(tipoDocCreado);
             ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteRegistrado);
             ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpresaDAO_NH")).Eliminar(tipoCreado);
             Spring.Dispose();
             Spring = null;
              
         }
        

    }
}